/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.Lid;
import model.Meerijder;
import model.MeerijderId;
import model.Rit;
import org.hibernate.Session;
import org.hibernate.Transaction;
import persistence.SessionManager;
import util.SendMail;

/**
 *
 * @author Johan
 */
public class AcceptRitController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // Haal de huidige sessie op
        HttpSession sessie = request.getSession();
        //huidige lid uit de sessie halen
        Lid Currentlid = (Lid) sessie.getAttribute("currentUser");

        //Geselecteerde rit en lid uit de request halen
        int ritid = Integer.parseInt(request.getParameter("id"));
        int lididMeerijder = Integer.parseInt(request.getParameter("lidid"));

        //hibernate session
        Session session = null;
        session = SessionManager.openSession();
        Transaction tx = session.beginTransaction();
       
        //rit ophalen uit db
        Rit rit = (Rit) session.load(Rit.class, new Integer(ritid));
        Lid lidMeerijder = (Lid) session.load(Lid.class, new Integer(lididMeerijder));

        if (rit.getRitNrPlaatsen() > 0) {
            //update meerijder: optie_geaccepteerd = true 
            MeerijderId mId = new MeerijderId(lididMeerijder, ritid);
            Meerijder m = new Meerijder(mId, true);
            session.update(m);
            //hier een commit om de meerijder te updaten
            tx.commit();
          
            //hier een nieuwe transaction beginnen om aan het einde nogmaals te committen
            Transaction trx = session.beginTransaction();

            //update rit: ritnrplaatsen -1
            rit.setRitNrPlaatsen(rit.getRitNrPlaatsen() - 1);

            if (rit.getRitNrPlaatsen() == 0) {
                //als de rit nu vol zit, rit disablen
                rit.setRitDeleted(Boolean.TRUE);
                String textMail = "De rit van " + rit.getRitVanPlaats()
                        + " naar " + rit.getRitNaarPlaats()
                        + " op " + rit.getRitDatum()
                        + " zit vol, u bent helaas niet uitgenodigd. Het verzoek is uit uw inschrijvingen verwijderd.";
                String subjectDenyMail = "Verzoek afgewezen";
                
                //alle lidnummers ophalen die nog niet zijn geaccepteerd
                String sqlJoin = "SELECT L.lid_id FROM lid L INNER JOIN meerijder M ON L.lid_id = M.lid_id WHERE M.optie_geaccepteerd = 0 AND M.rit_id = " + ritid;
                List<Integer> MeerijLidnummers = session.createSQLQuery(sqlJoin).list();
                if (MeerijLidnummers.size() > 0) {
                    //alle leden een afwijsmail sturen, daarna meerijrecord verwijderen
                    for (int i = 0; i < MeerijLidnummers.size(); i++) {
                        Lid tempLid = (Lid) session.load(Lid.class, new Integer(MeerijLidnummers.get(i)));
                        try {
                            SendMail.send(tempLid.getLidEmail(), subjectDenyMail, textMail);
                        } catch (Exception ex) {
                            System.out.println("fout mail afwijzing= " + ex.getMessage());
                        } finally {
                            MeerijderId meeId = new MeerijderId();
                            meeId.setRitId(ritid);
                            meeId.setLidId(tempLid.getLidId());
                            Meerijder mee = new Meerijder(meeId, false);
                            session.delete(mee);
                        }
                    }
                }
            }
            session.update(rit);
            trx.commit();
            
            // send mail naar lid met gegevens van currentlid
            try {
                String textMail = "Beste " + lidMeerijder.getLidDisplaynaam() 
                        + ", U bent door " + Currentlid.getLidDisplaynaam()
                        + " uitgenodigd om mee te rijden van " + rit.getRitVanPlaats()
                        + " naar " + rit.getRitNaarPlaats()
                        + " op " + rit.getRitDatum()
                        + ". U kunt " + Currentlid.getLidDisplaynaam()
                        + " bereiken op " + Currentlid.getLidEmail()
                        + ". Wij wensen u een fijne reis!";
                String subjectAcceptMail = "Verzoek geaccepteerd!";
                SendMail.send(lidMeerijder.getLidEmail(), subjectAcceptMail, textMail);
            } catch (Exception ex) {
                System.out.println("fout mail acceptatie= " + ex.getMessage());
            }
        } else {
            //rit zit al vol, deze else zal nooit worden uitgevoerd
        }
    
        //doorgaan naar MijnRittenController
        String address = "MijnRitten";
        RequestDispatcher dispatcher = request.getRequestDispatcher(address);
        dispatcher.forward(request, response);

        session.close();
    }
}
